<?php

/**
 * 简单工厂, 对于code02_interface.php 中面向接口的开发，客户端还是知道了服务器的所有类;
 * 现在想把服务器的类的实现对客户端隐藏,可以使用简单工厂。
 */

/**
 * 定义一个接口,实现缓存的写入
 */
interface Cache {
    function write();
}

/**
 * 服务端实现上面的接口, 此时服务端也不知道将会被谁调用
 */
class FileCache implements Cache {
    public function write() {
        echo '缓存写入文件中' . PHP_EOL;
    }
}

class RedisCache implements Cache {
    public function write() {
        echo '缓存写入Redis中' . PHP_EOL;
    }
}


/**
 * 定义一个简单工厂
 */
class SimpleFactory {
    public static function writeCache($type) {
        if ($type == 'file') {
            $client = new FileCache();
        } elseif ($type == 'redis') {
            $client = new RedisCache();
        } else {
            return 'error type';
        }
        return $client->write();
    }
}

/**
 * 客户端调用，此时客户端不知道服务器到底有哪些类名, 只知道对方开放了一个 SimpleFactory::writeCache() 方法
 */
SimpleFactory::writeCache('file'); //缓存写入文件中
SimpleFactory::writeCache('redis'); //缓存写入Redis中